/*********************************************************************
*
*      Copyright (C) 2005 Andrew Khan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/

package jxl.biff.formula;

import common.Assert;
import common.Logger;

import jxl.biff.CellReferenceHelper;

/**
 * A nested class to hold range information
 */
class ColumnRange3d extends Area3d
{
  /**
   * The logger
   */
  private static Logger logger = Logger.getLogger(ColumnRange3d.class);

  /**
   * A handle to the workbook
   */
  private ExternalSheet workbook;

  /**
   * The sheet number
   */
  private int sheet;

  /**
   * Constructor
   *
   * @param es the external sheet
   */
  ColumnRange3d(ExternalSheet es)
  {
    super(es);
    workbook = es;
  }

  /**
   * Constructor invoked when parsing a string formula
   *
   * @param s the string to parse
   * @param es the external sheet
   * @exception FormulaException
   */
  ColumnRange3d(String s, ExternalSheet es) throws FormulaException
  {
    super(es);
    workbook = es;
    int seppos = s.lastIndexOf(":");
    Assert.verify(seppos != -1);
    String startcell = s.substring(0, seppos);
    String endcell = s.substring(seppos + 1);

    // Get the the start cell details
    int sep = s.indexOf('!');
    String cellString = s.substring(sep + 1, seppos);
    int columnFirst = CellReferenceHelper.getColumn(cellString);
    int rowFirst = 0;

    // Get the sheet index
    String sheetName = s.substring(0, sep);
    int sheetNamePos = sheetName.lastIndexOf(']');

    // Remove single quotes, if they exist
    if (sheetName.charAt(0) == '\'' &&
        sheetName.charAt(sheetName.length() - 1) == '\'')
    {
      sheetName = sheetName.substring(1, sheetName.length() - 1);
    }

    sheet = es.getExternalSheetIndex(sheetName);

    if (sheet < 0)
    {
      throw new FormulaException(FormulaException.SHEET_REF_NOT_FOUND,
                                 sheetName);
    }

    // Get the last cell index
    int columnLast = CellReferenceHelper.getColumn(endcell);
    int rowLast = 0xffff;

    boolean columnFirstRelative = true;
    boolean rowFirstRelative = true;
    boolean columnLastRelative = true;
    boolean rowLastRelative = true;

    setRangeData(sheet, columnFirst, columnLast, rowFirst, rowLast,
                 columnFirstRelative, rowFirstRelative,
                 columnLastRelative, rowLastRelative);
  }

  /**
   * Gets the string representation of this column range
   *
   * @param buf the string buffer to append to
   */
  public void getString(StringBuffer buf)
  {
    buf.append('\'');
    buf.append(workbook.getExternalSheetName(sheet));
    buf.append('\'');
    buf.append('!');

    CellReferenceHelper.getColumnReference(getFirstColumn(), buf);
    buf.append(':');
    CellReferenceHelper.getColumnReference(getLastColumn(), buf);
  }
}
